#include "myStdio.h"

FILE_ *fopen_(const char *path_name,const char *mode) {
  
  int flag = 0;
  int defaultMode = 0666;
  // 如果是读操作
  if(strcmp(mode,"r") == 0) {
    flag |= O_RDONLY;
    // 如果是写操作
  }else if(strcmp(mode,"w") == 0) {
    flag |= (O_WRONLY | O_TRUNC | O_CREAT);
    // 如果是追加操作
  }else if(strcmp(mode,"a") == 0) {
    flag |= (O_APPEND | O_WRONLY | O_CREAT);
  }else {
    // 无操作
  }

  // 进行判断、打开文件操作
  
  int fd = 0;

  if(flag & O_RDONLY) fd = open(path_name,flag);
  else{
    fd = open(path_name,flag,defaultMode);
  }
  if(fd < 0) {
    const char *err = strerror(errno);
    write(2,err,strlen(err));
    return NULL;
  }

  // 创建一个FILE_的结构体
  FILE_ *fp = (FILE_*)malloc(sizeof(FILE_));
  assert(fp);
  // 赋初值
  fp->flags = SYNC_LINE;
  fp->cap = SIZE;
  fp->fileno=fd;
  fp->size = 0;
  memset(fp->buffer,0,SIZE);

  return fp; 
}


void fwrite_(const void *ptr, int num, FILE_ *fp) {

  //1. 写入到缓冲区
  memcpy(fp->buffer + fp->size,ptr,num);
  fp->size += num;
  // 2. 判断是什么刷新策略
  if(fp->flags & SYNC_NOW) {
    write(fp->fileno,fp->buffer,fp->size);
    fp->size = 0;  // 清空缓冲区
  }
  else if(fp->flags & SYNC_FULL) {
    if(fp->size == fp->cap) {
      write(fp->fileno,fp->buffer,fp->size);
      fp->size = 0;
    }
  }
  else if(fp->flags & SYNC_LINE) {
    if(fp->buffer[fp->size -1] == '\n') {
      write(fp->fileno,fp->buffer,fp->size);
      fp->size = 0;
    }
  }






}

void fflush_(FILE_ * fp) {
  if(fp->size > 0) write(fp->fileno,fp->buffer,fp->size);
  
  fsync(fp->fileno); // 将数据，强制要求OS进行刷新到外设！
  fp->size = 0;

}

void fclose_(FILE_ * fp) {
  
  fflush_(fp);
  close(fp->fileno);


}



